﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BiblioWeb.DataAccess;
using BiblioWebProyecto2013.Models;

namespace BiblioWebProyecto2013.ServiceLayer
{
    
    
    
    public  class Operaciones
    {
        private ContextoBiblio db ;
        private UsuarioRepo usuarioRepo;
        private RegistroSocioRepo registroSocioRepo;
        private ReservaRepo reservaRepo;
        private PrestamoRepo prestamoRepo;
        private EjemplarRepo ejemplarRepo;
        private MaterialRepo materialRepo;
        private EditorialRepo editorialRepo;
        private AutorRepo autorRepo;
        private TemaRepo temaRepo;

        public Operaciones(ContextoBiblio db)
        {
            this.usuarioRepo = new UsuarioRepo(db);
            this.registroSocioRepo = new RegistroSocioRepo(db);
            this.reservaRepo = new ReservaRepo(db);
            this.prestamoRepo = new PrestamoRepo(db);
            this.ejemplarRepo = new EjemplarRepo(db);
            this.materialRepo = new MaterialRepo(db);
            this.editorialRepo = new EditorialRepo(db);
            this.autorRepo = new AutorRepo(db);
            this.temaRepo = new TemaRepo(db);
        }


        //logica de reserva


        public Boolean ReservaValida(String userName)
        {
            int reservasActivas = this.registroSocioRepo.CantidadReservasActivas(userName);

            if (reservasActivas > 5)
                return false;
            else
                return true;
            

        }


       

        public void RealizarReserva(String userName, int idMaterial)
        {
            this.reservaRepo.CrearNuevaReserva(userName, idMaterial);
            this.registroSocioRepo.AumetarCantidadReserva(userName);

        
        
        }

        public void CancelarReserva(String userName, int idMaterial)
        {
            this.reservaRepo.CancelarReserva(userName, idMaterial);
            this.registroSocioRepo.DisminuirCantidadReserva(userName);

        }

        //logica de prestamo

        //devuelve el id del primer ejemplar que esta disponible por referencia
        private Boolean hayEjemplaresDisponibles(int idMaterial, ref int idEjemplar)
        {
            IList<int> idEjemplares = this.materialRepo.obtenerEjemplares(idMaterial);
            Boolean estaDisponible = false;
            foreach (int idEjemplarAux in idEjemplares)
            {

                if (!estaDisponible && this.ejemplarRepo.EstaDisponible(idEjemplarAux))
                {
                    estaDisponible = true;
                    idEjemplar = idEjemplarAux;
                }


            }
            return estaDisponible;

        }

        public void RealizarPrestamo(string userName, int idReserva)
        {
            int idMaterial = this.reservaRepo.obtenerIdMaterialReserva(idReserva);
            int idEjemplar = 0;
            if (this.hayEjemplaresDisponibles(idMaterial, ref idEjemplar))
            {
                this.prestamoRepo.CrearNuevoPrestamo(userName, idEjemplar);

                this.ejemplarRepo.MarcarEjemplarComoNoDisponible(idEjemplar);


                this.registroSocioRepo.AumetarCantidadPrestamo(userName);
                this.registroSocioRepo.DisminuirCantidadReserva(userName);

            }

            
        }



        public Boolean PrestamoValido(string userName)
        {
            int prestamosActivas = this.registroSocioRepo.CantidadPrestamosActivas(userName);
            Boolean estaHabilitado = this.registroSocioRepo.EstaHabilitado(userName);

            if (estaHabilitado && prestamosActivas < 3)
                return true;
            else
                return false;
        }

        public void DevolverPrestamo(string userName, int idPrestamo)
        {
            int idEjemplar = this.prestamoRepo.ObtenerIdEjemplarPrestamo(idPrestamo);

            this.ejemplarRepo.MarcarEjemplarDisponible(idEjemplar);

            this.prestamoRepo.CancelarPrestamo(idPrestamo);

           this.registroSocioRepo.DisminuirCantidadPrestamo(userName);
               

        }
            

        public void SuspenderUsuarioPorPrestamoTarde(String userName)
        {

            this.registroSocioRepo.Suspender(userName);
            
        }

        public void HabilitarUsuario(String userName)
        {

            this.registroSocioRepo.Suspender(userName);

        }
    }
}